<?php
/**
 * 逻辑返回结构类
 * 
 * Copyright (c) 2014~2019 https://desion.net All rights reserved.
 * Author: 阿林 QQ:120867629 <linhong00@gmail.com>
 */
declare (strict_types = 1);
namespace dsphp\logic;

trait Result
{
    // 返回错误代码
    private $_returnErrorCode = 9999;
    // 返回提示信息
    private $_returnErrorMessage = 'unknown error';
    // 返回数据
    private $_returnData = null;
    // 返回扩展数据
    private $_returnExtData = [];

    /**
     * 设置返回代码
     *
     * @return void
     */
    protected function setCode($code)
    {
        $this->_returnErrorCode = $code;
        return $this;
    }

    /**
     * 设置返回代码
     *
     * @return this
     */
    protected function setMessage($message, $msgObj = null)
    {
        $message = is_null($msgObj) ? $message : $msgObj->getMessage($message);
        $this->_returnErrorMessage = $message;
        return $this;
    }

    /**
     * 设置返回数据
     *
     * @return this
     */
    protected function setData($data)
    {
        if (is_null) {
            return false;
        }

        $this->_returnData = $data;
        return $this;
    }

    /**
     * 设置返回扩展数据
     *
     * @param mixed  $data  扩展数据
     * @param string $field 下标名称
     * @return this
     */
    protected function setExtData($data, string $field = '')
    {
        if (is_string($field) && $data) {
            $this->_returnExtData[$field] = $data;
        } elseif (is_array($data)) {
            $this->_returnExtData = array_merge($data, $this->_returnExtData);
        }

        return $this;
    }

    /**
     * 获取返回信息结果
     */
    protected function getReturn():array
    {
        $data = [
            'code'    => $this->_returnErrorCode,
            'message' => $this->_returnErrorMessage
        ];

        if (! is_null($data)) {
            $data['data'] = $this->_returnData;
        }

        return array_merge($this->_returnExtData, $data);
    }

    /**
     * 成功返回信息
     *
     * @param  mixed   $data    返回数据（数组，数字，字符串）
     * @param  string  $message 信息
     * @return array
     */
    protected function success($data = '', $ext = false)
    {
        if ($this->_returnErrorMessage == 'unknown error') {
            $this->_returnErrorMessage = 'ok';
        }

        $this->setCode(0);
        $this->setData($data);
        $this->setExtData($ext);

        return $this->getReturn();
    }
    
    /**
     * 失败返回信息
     *
     * @param  integer $code       代码
     * @param  string  $message    信息
     * @param  mixed   $data       返回数据（数组，数字，字符串）
     * @return array
     */
    protected function error($message, $code = 9999, $data = null, $ext = false)
    {
        $this->setCode($code);
        $this->setData($data);
        $this->setExtData($ext);
        if (is_object($message)) {
            $this->setMessage($code, $message);
        } else {
            $this->setMessage($message);
        }
        
        return $this->getReturn();
    }
}
